        TTL     > FS45 : DFS specific filing system calls

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;       DFS Filing system entry points that we've installed on the vectors
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

dos_args
        CMPIM   0
        BNE     #FT90
        CPYIM   0
        BNE     #FT90
        LDA     currfs
        RTS

90
        =       ar_args
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

dos_bget =      ar_bget
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

dos_bput =      ar_bput
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    YX = cb^

dos_file ROUT

        STXY    cbptr

        PHA

        LDYIM   17              ; Copy user cb to our space
01      LDAIY   cbptr
        STAAY   fil_blk
        DEY
        BPL     #BT01

        LDXY    fil_name        ; Alter the filename
        JSR     GetDFSName
        STXY    fil_name

        GENAD   fil_blk

        PLA

        CMPIM   &00
        BEQ     #FT04

        CMPIM   &FF
        BEQ     #FA10

        CMPIM   7+1
        BCS     #FT03           ; NOP unknown reason codes

        =       ar_file


49      PHA                     ; Common exit

        LDYIM   17              ; Copy info back to user cb
02      LDAAY   fil_blk
        STAIY   cbptr
        DEY
        CPYIM   1               ; Apart from the filename^
        BNE     #BT02

        LDXY    cbptr           ; Preserve YX
        PLA

03      RTS


04      JMP     #FA50


q2NFound
        JMP     qNotFound


q2NFile ; A = type
        CMPIM   2               ; Was it a dir ?
        BNE     q2NFound


q2IsADir
        JMP     qIsADir


10 ; LOAD: Mutate into reads of n bytes a go, poke ourselves

        LDA     fil_exec        ; Load at own ?
        PHA                     ; Remember for later

        LDAIM   5               ; Read file info to our cb
        =       ar_file
        CMPIM   1
        BNE     q2NFile

        LDXY    fil_load
        PLA
        BNE     #FA15           ; [load at own]

        LDYIM   2
        LDAIY   cbptr           ; Read desired load address from user cb
        TAX
        INY
        LDAIY   cbptr
        TAY

15      STXY    osf_load        ; Create zp^ for copy

        LDXY    fil_name
        LDAIM   &40             ; OpenIn
        =       ar_find
        STA     gbpb_handle

20      CLR     gbpb_nbytes+0
        LDAIM   1
        STA     gbpb_nbytes+1
        CLR     gbpb_nbytes+2
        CLR     gbpb_nbytes+3

        GENAD   osf_buffer
        STXY    gbpb_addr
        LDAIM   &FF             ; Pedantically set Host addresses
        STA     gbpb_addr+2
        STA     gbpb_addr+3

        LDAIM   4               ; Read from current seqptr
        GENAD   gbpb_blk
        =       ar_gbpb
        LDA     gbpb_nbytes+1
        CMPIM   1               ; No bytes read ?
        BEQ     #FT30

        LDYIM   0
25      LDAAY   osf_buffer      ; Copy bytes from buffer to the right place
        STAIY   osf_load
        INY
        INC     gbpb_nbytes
        BNE     #BT25
        INC     osf_load+1

        TYA                     ; Was that the last chunk ?
        BEQ     #BT20           ; [no, loop]

30      LDAIM   0               ; Close file
        LDY     gbpb_handle
        =       ar_find

        LDAIM   1               ; Was a file (must have been)
        JMP     #BT49           ; exit updating cb



50 ; SAVE: peek blocks and output them

        LDXY    fil_start       ; Create zp^ for copy
        STXY    osf_save

        LDAIM   7               ; Create right size file
        GENAD   fil_blk
        =       ar_file

        LDXY    fil_name
        LDAIM   &C0             ; OpenUp
        =       ar_find
        STA     gbpb_handle
        TAY

60      LDAI    osf_save
        =       ar_bput
        INC     osf_save
        BNE     #FT70
        INC     osf_save+1

70      LDA     osf_save
        CMP     fil_end
        BNE     #BT60
        LDA     osf_save+1
        CMP     fil_end+1
        BNE     #BT60

        LDAIM   0               ; Close file
        LDY     gbpb_handle
        =       ar_find

        GENAD   fil_blk
        LDAIM   2               ; Write right load, exec. FileSwitch doesn't
        =       ar_file         ; corrupt the cb 'cos I knows this
        LDAIM   3               ; Can't write attributes though, so use 2 ops
        =       ar_file

        LDXY    cbptr           ; Preserve YX
        LDAIM   0               ; Was a save op
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

dos_find ROUT

        ANDIM   &C0             ; Only look at top two bits
        BEQ     #FT50

        PHX
        PHY
        JSR     GetDFSName
        =       ar_find
        PLY
        PLX
        ORAIM   &00             ; I have known programs look at Z after this!
        RTS


50 ; CLOSE#Y

        =       ar_find
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; No h/w emulation added; I've never seen anyone GBPB data to the screen ram

; Only purists like Nosbod would complain about this one !

dos_gbpb ROUT

        CMPIM   8
        BEQ     #FA50
        BCS     #FT09           ; NOP unknown reason codes

        CMPIM   6
        BEQ     #FA30
        BCS     #FA40           ; [7]

        CMPIM   5
        BEQ     #FA20

        CMPIM   0
        BEQ     #FT09           ; NOP unknown reason codes

; Normal data xfer op 1..4

        =       ar_gbpb

09      RTS


; Read dir title, option, drive

20      STXY    cbptr

        LDYIM   stitend-stitle
        LDA     dfsdrive        ; Current drive number
        STAIY   cbptr
        DEY

21      LDAAY   stitle
        STAIY   cbptr
        DEY
        BPL     #BT21

        RTS

stitle  =       12              ; Must be always 12 to keep DFS programs happy
        =       "DFSDiscTitle"
        =       3               ; Boot option on current drive. 3 safest bet?
stitend


; Read csd drive,name,priv

30      STXY    cbptr

        LDA     dfsdrive
        LDX     dfsdir

35      LDYIM   1
        STAIY   cbptr
        TXA
        LDYIM   3
        STAIY   cbptr
        LDAIM   0               ; Privilege: owner
        INY
        STAIY   cbptr
        LDAIM   1
        DEY
        STAIY   cbptr           ; Dirname length
        STAI    cbptr           ; Drive number length
        RTS


; Read lib drive,name,priv

40      STXY    cbptr

        LDA     dfsldrive
        LDX     dfslib
        BRA     #BT35


 ! 0,"Fix GBPB 8"
; Only enumerate current directory

50      STXY    cbptr

        LDYIM   13              ; Copy user's cb to our cb
55      LDAIY   cbptr
        STAAY   gbpb_block
        DEY
        CPYIM   5
        BNE     #BT55

        LDA     dfsdir          ; Make 'f*' for match
        STA     dfsname+0
        LDAIM   "*"
        STA     dfsname+1
        CLR     dfsname+2

        GENAD   dfsdrive
        STXY    gbpb_dirname

        GENAD   dfsname
        STXY    gbpb_wildpat

        GENAD   osf_buffer      ; Return the names into my buffer
        STXY    gbpb_addr

        LDAIM   &FF             ; Pedantically set Host addresses
        STA     gbpb_dirname+2
        STA     gbpb_dirname+3
        STA     gbpb_wildpat+2
        STA     gbpb_wildpat+3
        STA     gbpb_addr+2
        STA     gbpb_addr+3

        LDA     gbpb_nbytes     ; Number requested
        PHA

        LDAIM   10
        GENAD   gbpb_block
        =       ar_gbpb

        LDA     gbpb_objtype
        CMPIM   1
        BEQ     #FT59
        CLR     gbpb_nbytes     ; None returned if directory

59      PLA
        SEC
        SBC     gbpb_nbytes
        STA     gbpb_nbytes     ; Number we failed to get

        LDYIM   13              ; Copy result back to user's cb
60      LDAAY   gbpb_block
        STAIY   cbptr
        DEY
        CPYIM   5
        BNE     #BT60

        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    YX -> user's DFS filename

; Out   YX -> filename in dfsname of form 'D.dsevench' to pass to Arthur

GetDFSName ROUT

        PHA
        Push    fscptr

        STXY    fscptr

        LDA     dfsdrive
        STA     dfsname+0
        LDAIM   "."
        STA     dfsname+1
        LDA     dfsdir
        STA     dfsname+2

        LDYIM   0
        LDAIY   fscptr
        CMPIM   space
        BCC     #FT60           ; [no arg]

        CMPIM   ":"
        BNE     #FT50           ; [no drive spec]

        INY
        LDAIY   fscptr
        JSR     chkdrive
        STA     dfsname+0

        INY
        LDAIY   fscptr
        CMPIM   space
        BCC     #FT98           ; [drive only]
        JSR     chkdot

        INY                     ; Skip '.'
        LDAIY   fscptr

50      JSR     chkdir
        TAX

        INY
        LDAIY   fscptr
        CMPIM   "."
        BEQ     #FT52

        DEY                     ; No dot, so must be pure filename
        BRA     #FT60

52      STX     dfsname+2
        INY                     ; Skip '.'

; Copy rest of filename into buffer

60      LDXIM   7
        STX     namecount
        LDXIM   0

61      DEC     namecount
        BMI     #FT63

        LDAIY   fscptr
        CMPIM   space+1
        BCC     #FT63

        STAAX   dfsname+3
        INY
        INX
        BRA     #BT61           ; Loop

63      LDAIM   CR
        STAAX   dfsname+3


        LDA     dfsname+2       ; Munge dir name now
        JSR     mkarfchar
        STA     dfsname+2

        GENAD   dfsname

        Pull    fscptr
        PLA
        RTS


98      JMP     qBadName

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

qBadName
        GENAD   mBadName
        JMP     CauseBRK

mBadName
        =       &CC
        =       "Bad name", 0

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

        LNK     FS99
